import * as FileSaver from 'file-saver';
/**
 *  4圆角矩形
 * Returns the canvasRadius of tempFilePath and nickname 
 * @param {string} tempFilePath 路径
 * @param {string} nickname 名称
 * 
 */
export function downloadBase64(tempFilePath, nickname) {
	FileSaver.saveAs(tempFilePath, nickname || '名片.png');
}
/**
 *  4圆角矩形
 * Returns the canvasRadius of ctx and x and y and wand h and r and color and closePath
 * @param {object} ctx canvas 2d对象
 * @param {number} x 矩形的x起点
 * @param {number} y 矩形的y起点
 * @param {number} w 矩形的宽
 * @param {number} h 矩形的高
 * @param {number} r 矩形的圆角半径
 * @param {string} color 矩形的背景色默认#ffffff
 * 
 */

export const canvasRadius = (
	ctx,
	x,
	y,
	w,
	h,
	r,
	color = '#ffffff',
) => {
	if (w < 2 * r) {
		r = w / 2;
	}
	if (h < 2 * r) {
		r = h / 2;
	}
	ctx.beginPath();
	ctx.moveTo(x + r, y);
	ctx.arcTo(x + w, y, x + w, y + h, r);
	ctx.arcTo(x + w, y + h, x, y + h, r);
	ctx.arcTo(x, y + h, x, y, r);
	ctx.arcTo(x, y, x + w, y, r);
	ctx.closePath();
	ctx.setFillStyle(color);
	ctx.fill()
	ctx.restore();
}

/**
 *  圆角图片
 * Returns the roundedImage of ctx and x and y and wand h and r and iamge and closePath
 * @param {object} ctx canvas 2d对象
 * @param {number} x 矩形的x起点
 * @param {number} y 矩形的y起点
 * @param {number} w 矩形的宽
 * @param {number} h 矩形的高
 * @param {number} r 矩形的圆角半径
 * @param {string} iamge 矩形的背景图
 *  @param {object} type 矩形的4个圆角
 */
export const roundedImage = (
	ctx,
	x,
	y,
	w,
	h,
	r,
	iamge,
	type = {}
) => {
	ctx.save()
	if (w < 2 * r) {
		r = w / 2;
	}
	if (h < 2 * r) {
		r = h / 2;
	}

	ctx.beginPath();
	ctx.moveTo(x + r, y);
	//右上角，设置r为0则变为直角
	const topRight = type.topRight ? type.topRight : r;
	ctx.arcTo(x + w, y, x + w, y + h, topRight);
	//右下角
	const bottomRight = type.bottomRight || type.bottomRight === 0 ? type.bottomRight : r;
	ctx.arcTo(x + w, y + h, x, y + h, bottomRight);
	//左下角
	const bottomLeft = type.bottomLeft || type.bottomLeft === 0 ? type.bottomLeft : r;

	ctx.arcTo(x, y + h, x, y, bottomLeft);
	//左上角
	const topLeft = type.topLeft ? type.topLeft : r;
	ctx.arcTo(x, y, x + w, y, topLeft);
	ctx.closePath();
	ctx.clip()
	ctx.drawImage(iamge, x, y, w, h)
	ctx.restore() // 返回上一状态
}
/**
 *  文本自适应
 * Returns the roundedImage of ctx 
 * @param {object} ctx canvas 2d对象
 *  @param {string} testText
 * @param {number} width 矩形的宽
 * @param {number} fontSize
 * * @param {number} x 
 * * @param {number} y 
 *  * @param {number} letterSpacing
 * @param {number} lineHeight 
 */

export const handleDrawText = (ctx, testText, width, fontSize = 14, x, y, letterSpacing = 10, lineHeight = 16, ) => {
	const handleDrawOneLineText = (str, h) => {
		let tempStr = ''
		for (let i = 0, len = str.length; i < len; i++) {
			ctx.fillText(
				str[i],
				i * letterSpacing + (ctx.measureText(tempStr).width) + x,
				h + y
			)
			tempStr += str[i]
		}
	}
	// 多个连续空格只保留一个
	let tempText = testText.replace(/(^\s*)|(\s*$)/g, ' ').replace(/ +/g, ' ')
	let textLen = tempText.length

	ctx.setFontSize(fontSize);
	// 如果绘制的文本总宽度并没有超过最大宽度，那么直接绘制
	if (
		ctx.measureText(tempText).width +
		textLen * letterSpacing < width
	) {
		ctx.fillText(tempText, 0 + x, fontSize + y)
	} else {
		let strArray = []
		let tempStr = ''
		for (let i = 0; i < textLen; i++) {
			let currStr = tempText[i]
			// 判断当前字符是否是换行符，如果是，那么新增下一行
			let isWrap = !/\r?\n/.test(currStr)
			if (
				isWrap &&
				(
					ctx.measureText(tempStr + currStr).width +
					(tempStr.length + 1) * letterSpacing
				) < width
			) {
				// 如果不是换行符且当前绘制的文本宽度加字距小于最大宽度，直接当前行字符串直接拼接
				tempStr += currStr
			} else {
				// 否则就是当前行的宽度已经达到极限，进行换行
				strArray.push(tempStr)
				if (isWrap) {
					// 如果不是换行符，直接新的一行开头就是这个字符
					tempStr = currStr
				} else {
					// 否则，新的一行开头将换行符替换为空字符串
					tempStr = ''
				}
			}
		}
		// 如果还有剩余结尾的字符串，直接就算作一行
		if (tempStr != '') {
			strArray.push(tempStr)
			tempStr = ''
		}
		strArray.forEach((str, index) => {
			// 逐行绘制，绘制的 y 坐标当前行行数加上字体大小加上行高近似的模拟
			handleDrawOneLineText(str, (index + 1) * (fontSize + lineHeight))
		})
	}

}